iT邦幫忙

2022 iThome 鐵人賽

DAY 28
0
Web 3

2022最火話題NFT到底是什麼?釐清NFT和虛擬貨幣以及區塊鏈的關係,做出自己專屬的NFT!!系列 第 28

Day 28 | 一個NFT不夠?直接給你一組!三分鐘學會製作一系列 NFT!(二)程式編譯

  • 分享至 

  • xImage
  •  

前言

昨天我們把資料都處理好了,現在我們終於進行可以最後的步驟,也就是程式編譯,要怎麼直接讓合約偵測使用者的錢包呢?我們就一起看下去吧!


正文

|Openzeppelin|

到最熟悉的Openzeppelin
點選似曾相識的Wizard,不過特別注意的是,不用勾選URI Storage,因為我們不用上鏈之後編輯。
https://ithelp.ithome.com.tw/upload/images/20221007/20152558Wt23OGwMQp.png

|Remix|

讓我們回到Remix編譯

    uint256 MAX_SUPPLY = 10;
   

這邊我們一樣新增最大供給量

    string baseURI = "ipfs://QmSFFACYLvFBML6TLQCPPU947SQgjetFLz6g1oTqfeamCV/";

往下我們再新增URI,需要到Pinata那邊複製

https://ithelp.ithome.com.tw/upload/images/20221012/20152558eIzj4v0WBE.png

而這邊要特別注意的是需要填入ipfs://...../最後需要再一條斜線
因為我們上傳的是資料夾,而token ID是從0開始計算的,所以在後面需要多一條斜線
範例:

https://ithelp.ithome.com.tw/upload/images/20221007/20152558yBnvqj5c4M.png

        function safeMint() public {
        uint256 tokenId = _tokenIdCounter.current();
        require (tokenId < MAX_SUPPLY, "All NFT have been minted.");
        string memory uri = string(abi.encodePacked(baseURI,Strings.toString(tokenId)));
        _tokenIdCounter.increment();
        _safeMint(msg.sender, tokenId);
        _setTokenURI(tokenId, uri);
    }

這邊msg.sender可以自動連接使用者錢包,不需要再輸入地址

https://ithelp.ithome.com.tw/upload/images/20221007/20152558l6WOOn1NFD.png
https://ithelp.ithome.com.tw/upload/images/20221007/20152558APjHBGJ690.png

一樣編譯+上鏈

https://ithelp.ithome.com.tw/upload/images/20221007/20152558mCH49PBvtb.png

之後點選SafeMint連接錢包,就可以了

|Opensea|

https://ithelp.ithome.com.tw/upload/images/20221007/20152558kxN1eD78cp.png

當成功之後就可以在Opensea testnet上看到你心愛的NFT了!

https://ithelp.ithome.com.tw/upload/images/20221007/20152558fUM5kXlh8D.png

這是連續10次mint的結果

小結

到這邊你已經可以自己發行你的NFT了,恭喜各位,明天我們再來研究看看還有沒有地方可以再改進的吧!
明天可以試試看如何去限制一個人可以mint的數量。


完整程式碼

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

import "@openzeppelin/contracts/utils/Strings.sol";
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/Counters.sol";

contract MyToken is ERC721, ERC721URIStorage, Ownable {
    using Counters for Counters.Counter;

    Counters.Counter private _tokenIdCounter;

    uint256 MAX_SUPPLY = 10;
    string baseURI = "ipfs://CID/";

    string public baseExtension = ".json";

    constructor() ERC721("I'mma Man NFT", "IMMN") {}

    function safeMint() public {
        uint256 tokenId = _tokenIdCounter.current();
        require (tokenId < MAX_SUPPLY, "All NFT have been minted.");
        string memory uri = string(abi.encodePacked(baseURI, Strings.toString(tokenId), baseExtension));
        _tokenIdCounter.increment();
        _safeMint(msg.sender, tokenId);
        _setTokenURI(tokenId, uri);
    }

    // The following functions are overrides required by Solidity.

    function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) {
        super._burn(tokenId);
    }

    function tokenURI(uint256 tokenId)
        public
        view
        override(ERC721, ERC721URIStorage)
        returns (string memory)
    {
        return super.tokenURI(tokenId);
    }
}

上一篇
Day 27 | 一個NFT不夠?直接給你一組!三分鐘學會製作一系列 NFT!(一)事前準備
下一篇
Day 29 | 分散持有者!限制mint數量並正式上鏈mint免費NFT吧!
系列文
2022最火話題NFT到底是什麼?釐清NFT和虛擬貨幣以及區塊鏈的關係,做出自己專屬的NFT!!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言